home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 081-090 / amok81 / m2 / demos / txt / eyes.mod next >
Text File  |  1993-11-04  |  2KB  |  90 lines

  1. MODULE Eyes; (* jr/30apr89, adapted to V4.0: bp/9/Dec/90 *)
  2.  
  3. (*$ LargeVars:=FALSE StackChk:=FALSE RangeChk:=FALSE OverflowChk:=FALSE
  4.     StackParms:=FALSE Volatile:=FALSE
  5.  *)
  6. FROM SYSTEM    IMPORT    ADDRESS, ADR, FFP;
  7. FROM ExecL    IMPORT    Forbid, GetMsg, Permit, ReplyMsg;
  8. FROM GraphicsD    IMPORT    DrawModes, DrawModeSet, RastPortPtr;
  9. FROM GraphicsL    IMPORT    DrawEllipse, SetAPen, SetDrMd, WaitTOF;
  10. FROM IntuitionD    IMPORT    IDCMPFlags, IDCMPFlagSet, NewWindow, ScreenFlags,
  11.             ScreenFlagSet, WindowFlags, WindowFlagSet, WindowPtr;
  12. FROM IntuitionL    IMPORT    CloseWindow, OpenWindow;
  13. FROM MathTrans    IMPORT    Sqrt;
  14.  
  15. VAR
  16.   u: WindowPtr;
  17.   rp: RastPortPtr;
  18.   nw := NewWindow{
  19.     title: ADR('EYES'),
  20.     leftEdge: 30, topEdge: 70,
  21.     width: 120, height: 35,
  22.     detailPen: 2, blockPen: 1,
  23.     idcmpFlags: IDCMPFlagSet{closeWindow},
  24.     flags: WindowFlagSet{windowDrag, windowDepth, windowClose},
  25.     type: ScreenFlagSet{wbenchScreen},
  26.     firstGadget: NIL,
  27.     checkMark: NIL,
  28.     screen: NIL,
  29.     bitMap: NIL
  30.   };
  31.  
  32. PROCEDURE InitWindow;
  33. BEGIN
  34.   u:=OpenWindow(nw);
  35.   IF u=NIL THEN HALT END;
  36.   rp:=u^.rPort;
  37.   SetDrMd(rp, DrawModeSet{complement})
  38. END InitWindow;
  39.  
  40.  
  41. VAR
  42.   pup: ARRAY [0..1] OF RECORD
  43.     cx, cy,             (* center of eye *)
  44.     x, y,               (* center of pupil *)
  45.     oldX, oldY: INTEGER (* old position of pupil *)
  46.   END;
  47.  
  48. PROCEDURE DrawPupil(i: INTEGER);
  49. VAR
  50.   dx, dy, l: FFP;
  51.   mx, my: INTEGER; (* mouse coordinates *)
  52. BEGIN
  53.   mx:=u^.mouseX; my:=u^.mouseY;
  54.   WITH pup[i] DO
  55.     dx:=FFP(mx-cx)*0.5;
  56.     dy:=FFP(my-cy);
  57.     l:=Sqrt(dx*dx + dy*dy);
  58.     IF l<=5.0 THEN (* inside eye *)
  59.       x:=mx; y:=my;
  60.     ELSE
  61.       l:=5.0/l; x:=cx+INTEGER(2.0*l*dx); y:=cy+INTEGER(l*dy)
  62.     END;
  63.     IF (oldX#x) OR (oldY#y) THEN
  64.       SetAPen(rp,1);
  65.       DrawEllipse(rp, oldX, oldY, 10, 5);
  66.       SetAPen(rp,2);
  67.       DrawEllipse(rp, x, y, 10, 5);
  68.       oldX:=x; oldY:=y;
  69.     END;
  70.   END (* WITH *)
  71. END DrawPupil;
  72.  
  73. VAR
  74.   msg: ADDRESS;
  75. BEGIN
  76.   InitWindow;
  77.   DrawEllipse(rp, 30, 22, 20, 10);
  78.   DrawEllipse(rp, 90, 22, 20, 10);
  79.   pup[0].cx:=30; pup[0].cy:=22;
  80.   pup[1].cx:=90; pup[1].cy:=22;
  81.   LOOP
  82.     DrawPupil(0); DrawPupil(1);
  83.     msg:=GetMsg(u^.userPort); IF msg#NIL THEN EXIT END;
  84.     WaitTOF;
  85.   END;
  86.   ReplyMsg(msg)
  87. CLOSE
  88.   IF u#NIL THEN CloseWindow(u); u:=NIL END;
  89. END Eyes.mod
  90.